﻿Imports System.Reflection
Imports System.Text.RegularExpressions
Imports System.Globalization

''' <summary>
''' キー制約
''' </summary>
''' <remarks>
''' シリアル化可能。
''' シングルトンパターン適用。
''' コンフィグファイルの名前はリソースで管理しています
''' </remarks>
<Serializable()>
Public Class KeyConstraint
    Inherits Serializer(Of KeyConstraint)

    Private Shared _instance As KeyConstraint
    ''' <summary>
    ''' インスタンスを取得します
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function Instance() As KeyConstraint
        If _instance Is Nothing Then
            _instance = New KeyConstraint

            'configファイルのパス
            Dim base = System.AppDomain.CurrentDomain.BaseDirectory
            Dim path As String = IO.Path.Combine(base, My.Resources.KEY_CONSTRAINT_CONFIG_FILE)

            If IO.File.Exists(path) Then
                '存在する場合はconfigファイルの内容を採用します
                _instance = Serializer.Deserialize(Of KeyConstraint)(path)
            Else
                '存在しない場合は現在の内容をconfigファイルに書き出します
                _instance.Serialize(path)
            End If
        End If
        Return _instance
    End Function

    ''' <summary>
    ''' ID列の命名規約
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>
    ''' 自クラス名＋ID
    ''' 自クラス名は省略可
    ''' </remarks>
    Public Property IdPropertyPattern As String = "^(?<myclass>.*)ID$"

    ''' <summary>
    ''' SEQプロパティの命名規約
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>
    ''' 自クラス名＋SEQ、または、自クラス名＋SID
    ''' 自クラス名は省略可
    ''' </remarks>
    Public Property SeqPropertyPattern As String = "^(?<myclass>.*)(Seq|SID)$"

    ''' <summary>
    ''' キーパターン文字列
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property KeyPattern As String
        Get
            '両方とも指定がある場合
            If String.IsNullOrEmpty(Me.IdPropertyPattern) = False AndAlso String.IsNullOrEmpty(Me.SeqPropertyPattern) = False Then
                Return String.Format("({0}|{1})", Me.IdPropertyPattern, Me.SeqPropertyPattern)
            End If

            '片方に指定がある、もしくは両方とも指定がない場合
            If String.IsNullOrEmpty(Me.IdPropertyPattern) = False Then
                Return Me.IdPropertyPattern
            Else
                Return Me.SeqPropertyPattern
            End If
        End Get
    End Property

    ''' <summary>
    ''' Nリレーション列の命名規約
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property NRelationClassPattern As String = "^(?<parent1>.+)(Combination|Inner|N)(?<parent2>.+)$"
End Class
